## Модуль 6. Функции


## Функции: определение def и их вызов

Этим занятием мы открываем с вами одну из ключевых тем в программировании – функции


```python
print()
f = print
f("hello")

print = "это была функция print"
f(print)


```

## Пример 1
```python

def sum2(a, b):
    c = a + b
    return c


result = sum2(5, 2)
print(result)
result = sum2(sum2(4, -2), 7) + 12 # Каков результат?

print(result)
```

## Пример 2 Реализовать функцию получения модуля числа

* Как еще можно реализовать функцию abs
* А что внутри у функции max2

## [Практика функции-2](/module-6/1_practice.md)



## Функции с произвольным числом параметров *args 

```python
def my_sum(*x):
    s = 0
    for i in x:
        s += i
    return s


y = my_sum(1, 2, 3, 4, 5)
print(y)

# А как передать список или кортеж в нашу my_sum

s = (1, 2, 3, 4, 5)
y = my_sum(*s)
print(y)

Или так

def my_sum(x)
```

Задание. В стандартном Python отсутствует функция получения среднего числа последовательности. 

a) Разработать такую функцию принимающую любую арифметическую последовательность и возвращающую среднее число
б) Реализовать округление результата с заданной точность(передаваемой также в функцию в виде именованного параметра)
Решение




```python
def average(*args, accuracy=3):
    s = sum(args) / len(args)   
    return round(s, accuracy)


s = (1, 2, 3, 4, 5)

y = average(*s)
print(y)

```


## Позиционные и именованные параметры 

Передачу произвольных параметров `*args` мы рассмотрели

Добавим энтропии в нашу функцию

```python
def average(*args, accuracy=3, indent = 10):
    s = sum(args) / len(args)
    s = str(round(s, accuracy))
    s = s.rjust(indent, '*')
    return s

s = (1, 2, 3, 4, 5)

y = average(*s, 3, 10)
print(y)
Работает!
у1 = average(*s, indent=5, accuracy=4)
И так работает
А сейчас!
y2 = average(*s, 3, 10)
y3 = average(*s, 5, accuracy=4)
print(y2) # 4.0
print(y3) # 3.3333

Что произошло? Почему 3.333
А теперь снова всё ОК или не ок
y3 = average(*s, 5, indent=4)
print(y3) # 3.333
```

почти, чего не хватает

Разбираемся 

```python
y = average(*s) # произвольные аргументы
y1 = average(*s, 5, 10) # произвольные и позиционные (он съел позиционные)
y2 = average(*s, 5, accuracy=10) #произвольные, позиционные, именованные
y3 = average(*s, accuracy=5, indent=10) # произвольные и именованные 
y4 = average(*s, accuracy=5, 10) # ошибка 
```

## Операторы * и ** для упаковки и распаковки коллекций